package com.situ.stmall.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.situ.stmall.mapper.UserMapper;

@Service
public class AService {
	
	@Autowired
	private AService aService;	// 代理对象
	
	@Autowired
	private UserMapper userMapper;
/**
 * 
 * Spring中七种Propagation类的事务属性详解：传播机制 (事务策略)
 * 
 *  场景在支持事务的方法中, 再调用支持事务的方法
 
 	1. 支持当前事务, 如果有当前事务, 加入到当前事务
 			如果没有当前事务:  新建一个事务, 非事务执行, 抛出异常
 			
 	2. 不支持当前事务, 如果有当前事务, 挂起当前事务/抛出异常
 			如果没有当前事务: 新建事务, 非事务执行, 非事务执行
 	
 	3. 事务嵌套
 			如果有则不挂起, 再新建事务
 			如果没有, 直接新建事务
 
	 REQUIRED：支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择。 
							如果当前有事务, 加入当前事务
	 SUPPORTS：支持当前事务，如果当前没有事务，就以非事务方式执行。 
							如果当前有事务, 加入当前事务
	 MANDATORY：支持当前事务，如果当前没有事务，就抛出异常。 
							如果当前有事务, 加入当前事务
							
	 REQUIRES_NEW：新建事务，如果当前存在事务，把当前事务挂起。 
	
	 NOT_SUPPORTED：以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。 
	
	 NEVER：以非事务方式执行，如果当前存在事务，则抛出异常。 
	
	 NESTED：支持当前事务，如果当前事务存在，则执行一个嵌套事务，如果当前没有事务，就新建一个事务。
 */
	//@Transactional( rollbackFor = Exception.class,propagation=Propagation.REQUIRED)	// 为方法添加事务	1. 当方法中没有任何数据库操作, 事务不会起作用
	public void a() {
		
		System.err.println("A.a()");
		
		userMapper.selectByPrimaryKey(1);
		
		System.err.println(this.getClass().getName());
		//this.b();	// 是在AService 对象上调用 b方法是没有被增强的方法, 
		aService.b(); // 代理对象调用b方法, 被增强了, 处理事务
		
		userMapper.selectByPrimaryKey(2);
		//throw new RuntimeException();
	}
	
	@Transactional(propagation=Propagation.MANDATORY)
	public void b() {
		userMapper.selectByPrimaryKey(3);
		//throw new RuntimeException();
	}
}
